home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1994 October / Macformat17.cdr / Shareware City / Developers / shutdown-fx-20-c / sfx control app ƒ / Shell ƒ / file interface.c < prev    next >
Text File  |  1994-07-11  |  6KB  |  163 lines

  1. /**********************************************************************\
  2.  
  3. File:        file interface.c
  4.  
  5. Purpose:    This module handles the standard file package (open & save
  6.             dialogs) and returns an FSSpec to deal with.
  7.  
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12.  
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this program in a file named "GNU General Public License".
  20. If not, write to the Free Software Foundation, 675 Mass Ave,
  21. Cambridge, MA 02139, USA.
  22.  
  23. \**********************************************************************/
  24.  
  25. #include "Script.h"
  26. #include "file interface.h"
  27. #include "environment.h"
  28. #include "util.h"
  29. #include "program globals.h"
  30.  
  31. Boolean GetSourceFile(FSSpec *editFile, Boolean isText, Boolean isApplication)
  32. /* a standard procedure which shows an open dialog box and returns the FSSpec of
  33.    the file you selected (or returns FALSE if you cancelled) */
  34. {
  35.     Point                where;
  36.     OSErr                isHuman;
  37.     StandardFileReply    reply;
  38.     SFReply                oldReply;
  39.     FInfo                fndrInfo;
  40.     long                procID;
  41.     short                i;
  42.     SFTypeList            theTypes;
  43.     
  44.     theTypes[0]=isApplication ? 'APPL' : isText ? 'TEXT' : SAVE_TYPE;
  45.     theTypes[1]='????';
  46.     isHuman=FALSE;            /* to err is human... */
  47.     if (gStandardFile58)    /* in system 7 or later, all the work is done for us */
  48.         StandardGetFile(0L, (isApplication || isText) ? 2 : 1, theTypes, &reply);    /* reply's got an FSSpec in it afterwards */
  49.     else    /* pre-system-7, we have to do a bit of work manually */
  50.     {
  51.         where.h = (screenBits.bounds.right - 348)/2;    /* center horizontally */
  52.         where.v = (screenBits.bounds.bottom - 200)/3;    /* 1:3 vertically */
  53.         SFGetFile(where, "\p", 0L, (isApplication || isText) ? 2 : 1, theTypes, 0L, &oldReply);    /* old routine */
  54.         
  55.         reply.sfGood = oldReply.good;
  56.         if (reply.sfGood)    /* if user selected a file */
  57.         {
  58.             reply.sfType = oldReply.fType;    /* type of file */
  59.             isHuman=GetWDInfo(oldReply.vRefNum, &reply.sfFile.vRefNum,    /* get vRefNum */
  60.                                 &reply.sfFile.parID, &procID);            /* and parID */
  61.             if (isHuman!=noErr)
  62.             {
  63.                 reply.sfFile.vRefNum = oldReply.vRefNum;    /* default to old method */
  64.                 reply.sfFile.parID = 0;                        /* & 0 parID -- let the */
  65.             }                                                /* system figure it out */
  66.             
  67.             /* get the name */
  68.             Mymemcpy((Ptr)(reply.sfFile.name), (Ptr)(oldReply.fName), oldReply.fName[0]+1);
  69.             
  70.             /* get the finder flags of the selected file -- I've never used them,
  71.                but it's just for completeness; StandardGetFile() will retrieve
  72.                this info, so we should fake it for consistency */
  73.             reply.sfScript=smSystemScript;
  74.             isHuman=HGetFInfo(reply.sfFile.vRefNum, reply.sfFile.parID,
  75.                                 reply.sfFile.name, &fndrInfo);
  76.             reply.sfFlags=(isHuman==noErr) ? fndrInfo.fdFlags : 0;
  77.             
  78.             reply.sfIsFolder=FALSE;
  79.             reply.sfIsVolume=FALSE;
  80.         }
  81.     }
  82.  
  83.     if ((reply.sfGood) && (!isHuman))    /* make the actual FSSpec */
  84.         MyMakeFSSpec(reply.sfFile.vRefNum, reply.sfFile.parID, reply.sfFile.name,
  85.                             editFile);
  86.         
  87.     return ((reply.sfGood) && (!isHuman));    /* TRUE if we have a valid file selected */
  88. }
  89.  
  90. Boolean GetDestFile(FSSpec *destFS, Boolean *deleteTheThing, Str255 theTitle)
  91. /* a standard save dialog box -- given a title (for the prompt), it returns the
  92.    file's FSSpec in destFS and whether a file of that name already exists in
  93.    deleteTheThing (TRUE if file already exists) */
  94. /* details are pretty much the same as GetSourceFile(), see above */
  95. {
  96.     Str255                otherName;
  97.     StandardFileReply    reply;
  98.     SFReply                oldReply;
  99.     Point                where;
  100.     FInfo                fndrInfo;
  101.     long                procID;
  102.     OSErr                isHuman, err;
  103.     short                i;
  104.         
  105.     isHuman=FALSE;
  106.     if (gStandardFile58)
  107.         StandardPutFile(theTitle, destFS->name, &reply);
  108.     else
  109.     {
  110.         where.h = (screenBits.bounds.right - 304)/2;
  111.         where.v = (screenBits.bounds.bottom - 184)/3;
  112.         SFPutFile(where, theTitle, destFS->name, 0, &oldReply);
  113.         reply.sfGood = oldReply.good;
  114.         if (reply.sfGood)
  115.         {
  116.             isHuman=GetWDInfo(oldReply.vRefNum, &reply.sfFile.vRefNum,
  117.                                 &reply.sfFile.parID, &procID);
  118.             if (isHuman!=noErr)
  119.             {
  120.                 reply.sfFile.vRefNum = oldReply.vRefNum;
  121.                 reply.sfFile.parID = 0;
  122.             }            
  123.             
  124.             Mymemcpy((Ptr)reply.sfFile.name, (Ptr)oldReply.fName, oldReply.fName[0]+1);
  125.             
  126.             reply.sfScript = smSystemScript;
  127.             err=HGetFInfo(reply.sfFile.vRefNum, reply.sfFile.parID,
  128.                                 reply.sfFile.name, &fndrInfo);
  129.             reply.sfReplacing=(err!=fnfErr);
  130.             
  131.             reply.sfIsFolder=FALSE;
  132.             reply.sfIsVolume=FALSE;
  133.         }
  134.     }
  135.  
  136.     if ((reply.sfGood) && (!isHuman))
  137.     {
  138.         *deleteTheThing=reply.sfReplacing;    
  139.         MyMakeFSSpec(reply.sfFile.vRefNum, reply.sfFile.parID, reply.sfFile.name,
  140.                         destFS);
  141.     }
  142.     
  143.     return ((reply.sfGood) && (!isHuman));
  144. }
  145.  
  146. pascal OSErr MyMakeFSSpec(short vRefNum, long parID, Str255 fileName,
  147.     FSSpecPtr myFSS)
  148. /* a standard function for creating an FSSpec out of its three component parts.
  149.    if the system supports FSSpecs, we let it do the work; otherwise we have to
  150.    do it manually. */
  151. {
  152.     if (gHasFSSpecs)
  153.         return FSMakeFSSpec(vRefNum, parID, fileName, myFSS);
  154.     else
  155.     {
  156.         myFSS->vRefNum=vRefNum;
  157.         myFSS->parID=parID;
  158.         Mymemcpy((Ptr)(myFSS->name), (Ptr)fileName, fileName[0]+1);
  159.     }
  160.     
  161.     return noErr;
  162. }
  163.